home *** CD-ROM | disk | FTP | other *** search
/ PC Zone 88 / PCZONE#88APR00.iso / Unreal Tournament / Mutators / GrenadeLauncher.umod < prev    next >
INI File  |  2000-02-02  |  65KB  |  1,398 lines

  1. [Setup]
  2. Product=Grenade Launcher
  3. Version=100
  4. Archive=GrenadeLauncher.umod
  5. SrcPath=.
  6. MasterPath=..
  7. Requires=UnrealTournament400Requirement
  8. Group=SetupGroup
  9. Group=Grenade LauncherGroup
  10.  
  11. [UnrealTournament400Requirement]
  12. Product=UnrealTournament
  13. Version=400
  14.  
  15. [SetupGroup]
  16. Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=473,Flags=3)
  17. Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=531,Flags=3)
  18.  
  19. [Grenade LauncherGroup]
  20. File=(Src=System\GrenadeLauncher.int,Size=281)
  21. File=(Src=System\GrenadeLauncher.u,Size=61284)
  22. File=(Src=Help\GrenadeLauncherReadme.txt,Size=1876)
  23.  
  24. [Setup]
  25. LocalProduct=Grenade Launcher
  26. ReadMe=Help\GrenadeLauncherReadme.txt
  27. SetupWindowTitle=Grenade Launcher Setup
  28. AutoplayWindowTitle=Grenade Launcher Options
  29. ProductURL=mailto:pricey_@hotmail.com
  30. VersionURL=mailto:pricey_@hotmail.com
  31. Developer=avengingangel
  32. DeveloperURL=mailto:pricey_@hotmail.com
  33.  
  34. [UnrealTournament400Requirement]
  35. LocalProduct=UnrealTournament
  36. ProductURL=http://www.unrealtournament.com/
  37. VersionURL=http://unreal.epicgames.com/
  38. Developer=Epic Games, Inc.
  39. DeveloperURL=http://www.epicgames.com/
  40. [Public]
  41. Object=(Name=GrenadeLauncher.GLMutator,Class=Class,MetaClass=Engine.Mutator,Description="Grenade Launcher, Changes rocket launcher to a grenade and pipebomb launcher.")
  42. Object=(Name=GrenadeLauncher.GrenadeLauncherMenuItem,Class=Class, MetaClass=UMenu.UMenuModMenuItem)
  43. ┴â*₧Eä@═¬Γ▄█üq╓!,╙╙¢└⌐╕Ü:═äNone FireRocketsTick PlayLoadingPlayRotatingBeginGrenadeLauncherSystemCoreAnimEndFiringRockets RotateAnim CheckTargetRotateRocket    LoadAnim BeginStateIdle    FireAnim
  44. ExplosionSetFontEngineUseAmmoCreateControl    PipeBombSetText    EndStateStationaryPawnBotpackClientReloadAltFire PendingLock ClientFireFire PlayRFiringClientAltFireUWindow NormalFireCreated PlayerPawnClientFiringFire2Fire3Rotate3PickupViewMesh ReplaceWith SplashJumpCheckFutureSightMesh
  45. AltFiringVectorClientAltFiringPlayIdleAnimTimerBotMutate
  46. ScoreKillPickupMessage    GiveAmmoCollisionHeight WarnTargetRenderOverlaysRenderTexture PostRenderColorPostBeginPlayPickupAmmoCount GrenadePackGrenadeLauncherMenuClientbTimedExplodeAltProjectileClassProjectileClass RocketPackLoad5Load6Load2CollisionRadiusRotate1Rotate2bCollideActorsSwitchToBestWeaponRotate4 BecomeItemSetHandLoad4
  47. ShakeViewRotate5Finish
  48. AdjustAimAltFireSoundDeathMessagePhysics SelectSoundLoad3    RateSelfMaxDesireabilityProcessTouchUT_EightballWeaponDescription FiringSpeed PlayRecoilCheckReplacementFire4 FireOffset
  49. ForceFireForceAltFire FireEffect    MenuHelpUMenu PickupSoundFire1 SetHelpText
  50. bNoSmoothSetNumericFloat    Register    bSizableSetNumericOnlySetMaxLength bWarnTarget
  51. NameColorAltRefireRate ClientClass    AIRating RefireRateIcon BobDampingPlayerViewScalePlayerViewOffsetAutoSwitchPriority
  52. shaketime    GetValue AdjustToss    shakemag
  53. shakevertGL_EightballSuggestAttackStyleGrenadeLauncherMenuWindowGrenadeLauncherMenuItemInventoryGroupUsedInWeaponSlot    ItemNameClientInstantFlash
  54. GLMutatorMaxAmmo Misc3Sound AmmoAmountload1Execute ExplodeTime    SetValuebRecommendSplashDamagebSplashDamageNotify    AmmoNamebAltWarnTargetBlowUp StatusIconPlayerViewMesh WindowTitleThirdPersonMesh Misc2Sound Misc1SoundCockingSound MenuCaptionWingInTimerCounter
  55. TimerRateZonespeed InstigatorTargetbestAim    VelocityBaseRateKillerRegion HeadRegion
  56. NewTargetEnemy    MaxSpeed PlayerOwner    RotationStartMutateStringFontOwnerrating BestTargetPlayOwnedSound    bChecked HitLocationSender
  57. PawnOwnerPMover    AmmoType
  58. bPointinghand
  59. bLockedOnOtherNumbOwnsCrosshair bForceFireAmmoValue ProjectileLodMeshGCalcDrawOffsetStaticSaveConfig
  60. DeltaTimebForceAltFire    RandSpin AdjustedAim    bestDistClipYAltProjectileSpeedCanvasProjectileSpeed
  61. Inventory    aimerrorSkillTex bWaterZone
  62. Eightball NotifyActorActorRollNetModeScriptedTextureSoundDampeningBitmapCountSetPos    DrawIconHealth PointRegion    Location NextMutatorbSuperRelevant MoveTargetUWindowEditBoxUWindowEditControlUWindowPulldownMenuItemUWindowSmallCloseButtonUWindowDialogClientWindowUWindowFramedWindowUWindowRootWindowUWindowCheckboxUWindowDialogControlUWindowWindowUWindowPulldownMenuSetSizeCreateWindow    ZoneInfoAlignWinLeftEditBoxWidthEditBox
  63. WinHeight    WinWidthWinTopRootOffsetIcons CloseButtonVSizeLevelUSize bUseAltModeSoundLoadingTempTexture
  64. enemyDist    enemyDir
  65. oldTargetAnglePickupsWeaponPickup Crosshair6EightAltFire BarrelMove    SeekLock    SeekLost
  66. SelectingRocketsLoaded
  67. RocketRad
  68. bFireLoad
  69. bTightWadLockedTarget bRetreatingETargetFireLocation    StartLocFireRot DupRocketsRandRotbCanHitOwner
  70. bHitWater
  71. SmokeRateNumExtraGrenadesStyle
  72. LevelInfoTournamentPlayerWeaponAnimSequenceMutatorUMenuModMenuItem    MenuItemRoleClassPackageDynamicLoadObjectR TextBuffer ReturnValueObjectTournamentWeapon    FunctionStateRotatorStruct UnrealShare StrPropertyStructPropertyNamePropertyYawObjectPropertyFBES ScriptTextFloatPropertyAXCBoolPropertyViewRotationTournamentAmmoTournamentPickup SpawnSoundut_seekingrocket ut_grenadebInstantRocketbNoviceXScale    AffectorbCanClientFire
  73. Ammocount miniammoled    LEDFont2Eightm Eight2Pick
  74. EightHand    Use8ballClientRocketsLoadedbAlwaysInstant bClientDone    bRotatedbPendingLockTPAimRotdiffbMultiRocketsRocketPackMesh IntPropertyPitchBytePropertyZYbFire    bAltFireClipXbAutoDetonatebDieDetonate bRequireWepPawn
  75. Createdby
  76. BombOwnerbTimedExplodeCheckbAutoDetonateCheckbDieDetonateCheckEditTimedExplodeTimedExplodeExplodeTimeVarTimedExplodeFloatóCeM                  ╨_╖ólÇñπâ=òé    √a)╬    √a)╬â=òéólÇñπâ=òé    √a)╬    √a)╬â=òéólÇñπâ=òéâ=òéëD╙S$zCâ âcÜäò{~        ;              √a)╬ò726ÄÖ╨_╖Ö╨_╖Ö╨_╖ßÆ╘√Rä9δ }ä9δ }ä9δ }╞╣    ë)äû<ä-A1Ç¢NòDÉÉÉâ+î ûJ ââ@0î!îâXÇ └aâ_Çâû    4îî86î.î[2Gî3îä¬]î¬úÇÇúZ$ÇäÇ>Ç@,FYî"L@
  77.  REcN3IEé-⌐/ääÜ:╜:$    rô*ùôƒ%q!''( √Qztú4G-ª'-⌐'+rô*.äçEô&q!0 &Ç│Ç¢·VT ,X-ª'#rô*.äçVô&;.¬ÿ-⌐'-ä-Jéw;*;-╚¬-- '&q!q!!VOÿa/!5    w*- '&ÿñ$-'q!q!! =│éééw*üa/!
  78. ░├═╠L?K▒ß╪ÿ Å Å««?ɽ?É»á?≥½?├ÿñ$-'q!! ==éééééééü.╢ç-╔
  79. ░├333?    a!wÿö*5ärÿöÿ┬rÿ┬*üÿöa/!>▒ß╪ÿ Åÿö Å«?╝½?├2░ß╪ÿ Åÿö Å?╨ =rÿö▒≥ÜÖ?aÇ?'ÿñ$-'q!! -(q!$Vq!$ ║q@G                  2Sf]k║ⁿM╗∩┌o √┌o √#ëxT]] Grenade Launcher Configurationr╙╫jJC                  0T≥ó▒╫┌π╠~Ö╨_╖É|.X┌Ö╨_╖É|.X┌Ö╨_╖É|.X┌Üt╡≡Ö╨_╖Ö╨_╖É|.X┌É|.X┌É|.X┌É|.X┌Ö╨_╖É|.X┌É|.X┌É|.X┌É|.X┌Ö╨_╖É|.X┌É|.X┌É|.X┌É|.X┌Ö╨_╖Üt╡≡Üt╡≡Üt╡≡Üt╡≡Üt╡≡Üt╡≡Üt╡≡Üt╡≡┼U K/Üt╡≡Ö╨_╖Üt╡≡Üt╡≡#ëⁿOO"üÉ5IEé-⌐/ääÜ:╜:$    rô*ùôƒ%q!2'( ├hB        Ç          2V▒φx┴├εL#!ëP" N"HJü8]You picked up a grenade pack.+≤^$ÜÖÖ>Z/≤K$╪A:$@AN╙ÇÇMHÇtî\îIÇî^Çâm`F╤[Ç╕@Çä¼lΘ■?¼&- ( ─4XªIè rw*-º'çb.äç¥ça≈$.äç¥╙éw.ä*
  80. ░├333?.ä).äç╪9.äç ┤-.äçñ$- '&q!! uféw*    r*ça╧$.äç¥-º(u*-º(-( ÇßSg|QMΣ%¢:.äçñ% J¢:.äç╖%-ª(zÿôƒ%.äçO aá?'*-º(╡--ª'╩▓╙?%aÇ?' ñ          ╠hÇlÇÇULk"ÖPI-«ä-«/éé-⌐w.äç*ùôƒ%-« ≥r▓MR-»(-«( ¼n╕¬R-»(-«( ╨KF'≈W          ┼D┴*S86äÜ:.äçñ%ÿôƒ%
  81.  ■m    ƒ└Pºÿéé-⌐w.úç*ùôƒ%fä-»¢:.äçñ%8 ÿÿä-«¢:.äç╖%8" q!8     B:iG─Ur.úç*2▒├├⌡¿>.äçñ$UÜ:.äçñ%q! rÿôƒ%q! ¼Üôƒ&ça╧$.äç¥ô&-' ┼Gu²(AX'ér.úç*²ääääääw.äçΓ.äç┬    w*r.äçö*w.╩ç╔*2éÜ:ç▀:$░6íç ₧?,7░ß╪ç Å.äç┬ Å?Éü.äç .ÜÖ>.äçñ$VäÜ:.äçñ%
  82. ù,q! Ç╠p{2+╬Z          ╨t    \C~$--(═╠î?|9Ü,q! Ñô&r¢:.äç╖%-' ┼w.ä*.ä).äç╪9.äç ┤Hw*w*ça╧$.äç¥-º(HHw*ça≈$.äç¥-ª'çb½ÜÖ?.äç¥ Ç┴K    ΣWñ'äü-⌐r.äç*q!óF-"└?%q!óq-═╠î?-(ÑóàÜ,
  83.  u!ô&-' ¼yΘY'- (&ô&-' ╟z'âZ%-"(-( vW╩åj           R~ 0;[ ÇO}@1Z[ Ç╠g5|[
  84. -»' ¼w2≡F¼- '& √Pf-?÷[( Ç╞q    ╟¬S»'äü-⌐r.äç*q!¡F-"└?%q!¡q-═╠î?-(Ñ¡Éä-
  85. Ü,
  86.  u!ô&-' ├J≤╞V%-"(-( √H-°δ@' Ç┼o┐╕<1/äÜ:.äç╖%
  87. ù,q! ¼Eπ├U@- '!-&
  88. >&ô&-' ┼x²aW86äÜ:.äç╖%ÿôƒ%
  89.  Uy Æ7+
  90. .äç-ª(╘ça/!&σ
  91.  ┤+4G╫╫╫╫ç Å╥╒6Γ¡+╒6╓¡4╒6í¡GM{n?
  92. bMY+φr
  93. ö**éça/!5.╢ç-╔*░ß╪
  94. ö Å
  95.  Å?╨╫╫ç Å╥╒6í¡#Ç?)P╪
  96. ö ÅD║»?£6á)  ?£6á
  97.  ╙      éù û▀π*╚ü-)P╪╫
  98. ö Å╒½»?,
  99. ▌ÜÖÖ>
  100. ö ₧D║»?£6á)  ?£6á
  101.  ╙  ╚éùÇ>û┴*a+4
  102. ö Å(w**
  103. ö-ªw* Ç*╦MÇ═Ah:╢[
  104. -«' N
  105. m)4!ô&-"'v! Ç°ss$O*Ia            ;Ç7ÇαYUF +n7ß╪.äçö Åç Åf░7?X]░7?,└┐c333┐l═╠L╛ ■k    └╥iM>éü-ùôƒ%└?%&-' *V Ç┌Z%]█▌%Zÿôƒ%└%%.äçKrö*µ½ééw╔*'┌╔ ₧#ü .═╠╠=═╠╠=,╪ö Åç Åß,µé░?hnr∩nä▒?,µCéû╦,2,û╦ôö╦,«═╠L=½oâ:½öa/!╕═╠╠>≤▒6íç Å«6íö Å?,x╕Ç>Ç;▒6íö Å«6íç Å?,á╣33│>ÇÇ▒6íö Å«6íç Å?,P╣═╠L=├äÜ:ç▀:$6τç φ-ε%%R±░½└┐6í,%A░├?R-D░█╓,ç ₧333┐%%Réé-D░? 
  106. ░├═╠╠>%& ■\3╠▒$Fr╚σ 7■Ω%?a!═╠╠=Da&!? /^B!╣9"+eça/!&.úçT╠½╧?╪.úçL═╠╠╛#Ç"DßC>Cw─*─i╗- ╗ ò≈$½Ç@.äç¥Γ╗╬$½Ç@.äç¥é- -aBHq=
  107. ?═╠L=)aBHÜÖ?═╠L= ╫5(dhü?(a/!`,(GrenadeLauncher.GL_Eightball(}(a/!G,(GrenadeLauncher.GrenadePack(' cW│ò!Fç'╗▐$½═╠╠=.äç¥aWZ ═╠L= `ÇÇ┘]C6$╗₧xzCdetbomb/a0 âwva/!vr.    '>.     Å10£w├*├C> XÇdb½╥ Lrç* ç ╗Σ$.äç¥aX? ═╠L= ²g>£∞Θ²-⌠-ºτ-⌠1⌡Ç?¼∞ D`²½?»∞½? ╬╬1½?»°½? ╬╦1σ$┘ ╬Ç?σ$ ╙ae79+ön-2/a0 â$ml$a/!lr.    $'@.    $$ Å10Æw├*├e@ ÇΣDQ<ô&- ⁿ·ΣQ ⁿ·*     J //=============================================================================
  108. // GrenadePack.
  109. //=============================================================================
  110. class GrenadePack extends TournamentAmmo;
  111.  
  112. #exec MESH IMPORT MESH=RocketPackMesh ANIVFILE=MODELS\eightballammo_a.3D DATAFILE=MODELS\eightballammo_d.3D X=0 Y=0 Z=0
  113. #exec MESH ORIGIN MESH=RocketPackMesh X=0 Y=0 Z=0 ROLL=-64
  114. #exec MESH SEQUENCE MESH=RocketPackMesh SEQ=All    STARTFRAME=0  NUMFRAMES=1
  115. #exec TEXTURE IMPORT NAME=JRocketPack1 FILE=MODELS\eightballammo.PCX GROUP="Skins"
  116. #exec MESHMAP SCALE MESHMAP=RocketPackMesh X=0.036 Y=0.036 Z=0.072
  117. #exec MESHMAP SETTEXTURE MESHMAP=RocketPackMesh NUM=1 TEXTURE=JRocketPack1
  118.  
  119. 'âm3//=============================================================================
  120. // GrenadeLauncherMenuClient
  121. //=============================================================================
  122. class GrenadeLauncherMenuClient expands UWindowDialogClientWindow;
  123.  
  124. var UWindowCheckBox bTimedExplodeCheck, bAutoDetonateCheck, bDieDetonateCheck/*, bRequireWepCheck*/;
  125. var UWindowEditControl EditTimedExplode;
  126. var UWindowSmallCloseButton CloseButton;
  127. var string TimedExplode, ExplodeTimeVar;
  128. var float TimedExplodeFloat;
  129.  
  130. function Created()
  131. {
  132.     Super.Created();
  133.     
  134.     bTimedExplodeCheck = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 30, 10, 148, 1));
  135.     bTimedExplodeCheck.SetText("Timed Eplode");
  136.     bTimedExplodeCheck.SetFont(F_Normal);
  137.     bTimedExplodeCheck.Align = TA_Left;
  138.     bTimedExplodeCheck.bChecked = class'GLMutator'.default.bTimedExplode;
  139.     
  140.     bDieDetonateCheck = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 30, 22, 148, 10));
  141.     bDieDetonateCheck.SetText("Detonate on death");
  142.     bDieDetonateCheck.SetFont(F_Normal);
  143.     bDieDetonateCheck.Align = TA_Left;
  144.     bDieDetonateCheck.bChecked = class'GLMutator'.default.bDieDetonate;
  145.     
  146.     bAutoDetonateCheck = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 30, 34, 148, 20));
  147.     bAutoDetonateCheck.SetText("Auto-detonate");
  148.     bAutoDetonateCheck.SetFont(F_Normal);
  149.     bAutoDetonateCheck.Align = TA_Left;
  150.     bAutoDetonateCheck.bChecked = class'GLMutator'.default.bAutoDetonate;
  151.     
  152.     /*
  153.     bRequireWepCheck = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 30, 46, 148, 30));
  154.     bRequireWepCheck.SetText("Require grenade launcher");
  155.     bRequireWepCheck.SetFont(F_Normal);
  156.     bRequireWepCheck.Align = TA_Left;
  157.     bRequireWepCheck.bChecked = class'GLMutator'.default.bRequireWep;
  158.     */
  159.     
  160.     EditTimedExplode = UWindowEditControl(CreateControl(class'UWindowEditControl', 30, 46, 148, 30));
  161.     EditTimedExplode.SetText("Time to explode");
  162.     EditTimedExplode.SetHelpText("Time till pipe bomb explodes.");
  163.     EditTimedExplode.SetFont(F_Normal);
  164.     EditTimedExplode.SetNumericOnly(True);
  165.     EditTimedExplode.SetNumericFloat(True);
  166.     EditTimedExplode.SetMaxLength(6);
  167.     EditTimedExplode.Align = TA_Left;
  168.     EditTimedExplode.EditBox.Offset = 2;
  169.     EditTimedExplode.EditBoxWidth = 40;
  170.     ExplodeTimeVar = string(class'GLMutator'.default.ExplodeTime);
  171.     EditTimedExplode.SetValue(ExplodeTimeVar);
  172.     EditTimedExplode.Register(self);
  173.     
  174.     CloseButton = UWindowSmallCloseButton(CreateWindow(class'UWindowSmallCloseButton', WinWidth-48, WinHeight-19, 48, 16));
  175. }
  176.  
  177.  
  178. function Notify(UWindowDialogControl C, byte E)
  179. {
  180.     switch(E)
  181.     {
  182.         case DE_Change:
  183.         switch(C)
  184.         {
  185.             
  186.             case bTimedExplodeCheck:
  187.             class'GLMutator'.default.bTimedExplode = bTimedExplodeCheck.bChecked;
  188.             
  189.             case bAutoDetonateCheck:
  190.             class'GLMutator'.default.bAutoDetonate = bAutoDetonateCheck.bChecked;
  191.                 
  192.             case bDieDetonateCheck:
  193.             class'GLMutator'.default.bDieDetonate = bDieDetonateCheck.bChecked;
  194.             
  195.             /*
  196.             case bRequireWepCheck:
  197.             class'GLMutator'.default.bRequireWep = bRequireWepCheck.bChecked;
  198.             */
  199.                 
  200.             case EditTimedExplode:
  201.             TimedExplodeFloat = float(EditTimedExplode.GetValue());
  202.             class'GLMutator'.default.ExplodeTime = TimedExplodeFloat;
  203.                 
  204.             class'GLMutator'.static.StaticSaveConfig();
  205.             
  206.             break;
  207.         }
  208.     break;
  209.  
  210.     }
  211.  
  212. }
  213. ¼C#Oc]_.äçr*  c▄<.úçô&lû%%òr<*-░½├?,▌σ ┤0.6!╫╫╫╫ç Å╥╒6Γ¡0╒6╓¡.╒6í¡6A- ½ W╪!DΦ'-█m½ B╨!DΦ'-⌡îw<*½ ┤!ô&çb¥╤ü- *-º("w*8.ä éw*w8*-º("8*-(-ª'½-Ç@iä-    ü- -α@-Aù&Mù%Σ-A#╪╫╪!╒»½╗-≡@.╒»½╝-?,6╘╘0?,├∩#!{- ª▒?%Gé░?,    ü-6áD»?6á½½?Xªæé▒`@    ü-6áD«?6á½½»?,?Xª6áá½ûw*çb½ÜÖ?.äç¥a ò !#⌡ôù%6═ D»½├?▄?ε6á D»½├?▄?ε6╒ D»½├?▄?ε ₧a ₧ xçb½ÜÖ?.äç¥a ò !#⌡xù%6═ D»½├?▄?ε6á D»½├?▄?ε6╒ D»½├?▄?ε ₧a ₧ 7*a      !#½*b7ù%6═ D»½├?▄?ε6á D»½├?▄?ε6╒ D»½├?▄?ε* ₧a* ₧ ╕∙1å?ªx-(-( r▐P?5ÿôƒ%q! ô&-' nbÇ╧i:@÷D-E -5F /I¢:±ε:$a!c[-EaF('ÿBÜ:╜:$σÿ ┤:]\₧╫╘╘:█ÿ ₧:═╠╠>╘9╙«∙½├?,d╕6í₧?,╥≡zD╤PCG-a(B6τÿ ┌-ε-`'v!₧╒ÜÖ?₧ b//=============================================================================
  214. // GrenadeLauncherMenuWindow.
  215. //=============================================================================
  216. class GrenadeLauncherMenuWindow expands UWindowFramedWindow;
  217.  
  218. function Created()
  219. {
  220.     
  221.     SetSize(200, 120);
  222.     WinLeft = (Root.WinWidth - WinWidth) / 2;
  223.     WinTop = (Root.WinHeight - WinHeight) / 2;
  224.     Super.Created();
  225. }
  226.  
  227. ╤I    ╞_=╒$--(═╠î?╙9Ü,q! Ñô&ƒér.úç*%ä▒├?r.äçö*.äç╖$-ª'çb½ÜÖ?.äç¥ ∙Lf0∩X@-º(            Eûk//=============================================================================
  228. // GrenadeLauncherMenuItem.
  229. //=============================================================================
  230. class GrenadeLauncherMenuItem expands UMenuModMenuItem;
  231.  
  232. function Execute()
  233. {
  234.     MenuItem.Owner.Root.CreateWindow(class'GrenadeLauncherMenuWindow',10,10,10,10);
  235.  
  236. }
  237.  
  238. ╛uMH                  2v∩1O▓╛ëⁿ═╖╟;aG░╥╒╢mΩ┌o √k#ëb]Grenade Launcher Setupj]$#Setup the Grenade Launcher mutator▄p46┌!╫Å╘#Ç??, ╒w__>m;-I -39-I9w_'^ ÇâÇ_//=============================================================================
  239. // PipeBomb.
  240. //=============================================================================
  241. class PipeBomb expands ut_grenade;
  242.  
  243.  
  244. var Actor Createdby;
  245. var() Actor BombOwner;
  246.  
  247. var bool bCanHitOwner, bHitWater;
  248. var float Count, SmokeRate;
  249. var int NumExtraGrenades;
  250.  
  251. simulated function PostBeginPlay()
  252. {
  253.     local vector X,Y,Z;
  254.     local rotator RandRot;
  255.     local bool bTimedExplode;
  256.     local float ExplodeTime;
  257.     
  258.     bTimedExplode = class'GLMutator'.default.bTimedExplode;
  259.     ExplodeTime = class'GLMutator'.default.ExplodeTime;
  260.     
  261.     //Super.PostBeginPlay();
  262.     
  263.     if ( Level.NetMode != NM_DedicatedServer )
  264.         PlayAnim('WingIn');
  265.         
  266.     if (bTimedExplode)
  267.         SetTimer(ExplodeTime, False);
  268.     
  269.     BombOwner = Instigator;
  270.  
  271.     if ( Role == ROLE_Authority )
  272.     {
  273.         GetAxes(Instigator.ViewRotation,X,Y,Z);    
  274.         Velocity = X * (Instigator.Velocity Dot X)*0.4 + Vector(Rotation) * (Speed +
  275.             FRand() * 100);
  276.         Velocity.z += 210;
  277.         MaxSpeed = 1000;
  278.         RandSpin(50000);    
  279.         bCanHitOwner = False;
  280.         if (Instigator.HeadRegion.Zone.bWaterZone)
  281.         {
  282.             bHitWater = True;
  283.             Disable('Tick');
  284.             Velocity=0.6*Velocity;            
  285.         }
  286.     }    
  287. }
  288.  
  289. simulated function Timer()
  290. {
  291.     Explosion(Location+Vect(0,0,1)*16);
  292. }
  293.  
  294.  
  295. simulated function ProcessTouch( actor Other, vector HitLocation )
  296. {
  297.     local bool bAutoDetonate;
  298.     
  299.     bAutoDetonate = class'GLMutator'.default.bAutoDetonate;
  300.     
  301.     if (bAutoDetonate)
  302.     {
  303.         if (Other != BombOwner)
  304.             Explosion(HitLocation);
  305.     }
  306. }
  307.  
  308. function BlowUp(vector HitLocation)
  309. {
  310.     Super.Blowup(Location);
  311. }
  312.  
  313. simulated function Explosion(vector HitLocation)
  314. {
  315.     Super.Explosion(Location);
  316. }
  317. ≡x}ZI+≡Å Çî÷|N÷Å Çî└%    X▌HC≡B═¼»█┘┘?,╩¼»█▄▄?,└ U¬//=============================================================================
  318. // GL_Eightball.
  319. //=============================================================================
  320. class GL_Eightball extends TournamentWeapon;
  321.  
  322. #exec MESH IMPORT MESH=Eightm ANIVFILE=MODELS\Eightball2_a.3D  DATAFILE=MODELS\Eightball2_d.3D X=0 Y=0 Z=0
  323. #exec MESH ORIGIN MESH=Eightm X=0 Y=0 Z=0 YAW=-64 ROLL=0
  324. #exec MESH SEQUENCE MESH=Eightm SEQ=All      STARTFRAME=0   NUMFRAMES=169
  325. #exec MESH SEQUENCE MESH=Eightm SEQ=Select   STARTFRAME=0   NUMFRAMES=20 RATE=33 GROUP=Select
  326. #exec MESH SEQUENCE MESH=Eightm SEQ=Still    STARTFRAME=19  NUMFRAMES=1
  327. #exec MESH SEQUENCE MESH=Eightm SEQ=Idle     STARTFRAME=19  NUMFRAMES=1
  328. #exec MESH SEQUENCE MESH=Eightm SEQ=Fire1    STARTFRAME=20  NUMFRAMES=8
  329. #exec MESH SEQUENCE MESH=Eightm SEQ=Load1    STARTFRAME=28  NUMFRAMES=7  RATE=15
  330. #exec MESH SEQUENCE MESH=Eightm SEQ=Rotate1  STARTFRAME=35  NUMFRAMES=7  RATE=15
  331. #exec MESH SEQUENCE MESH=Eightm SEQ=Load2    STARTFRAME=42  NUMFRAMES=7  RATE=15
  332. #exec MESH SEQUENCE MESH=Eightm SEQ=Fire2    STARTFRAME=49  NUMFRAMES=11
  333. #exec MESH SEQUENCE MESH=Eightm SEQ=Rotate2  STARTFRAME=60  NUMFRAMES=7  RATE=15
  334. #exec MESH SEQUENCE MESH=Eightm SEQ=Load3    STARTFRAME=67  NUMFRAMES=7  RATE=15
  335. #exec MESH SEQUENCE MESH=Eightm SEQ=Fire3    STARTFRAME=74  NUMFRAMES=10
  336. #exec MESH SEQUENCE MESH=Eightm SEQ=Rotate3  STARTFRAME=84  NUMFRAMES=7  RATE=15
  337. #exec MESH SEQUENCE MESH=Eightm SEQ=Load4    STARTFRAME=91  NUMFRAMES=7  RATE=15
  338. #exec MESH SEQUENCE MESH=Eightm SEQ=Fire4    STARTFRAME=98  NUMFRAMES=11
  339. #exec MESH SEQUENCE MESH=Eightm SEQ=Rotate4  STARTFRAME=109 NUMFRAMES=7  RATE=15
  340. #exec MESH SEQUENCE MESH=Eightm SEQ=Fire5    STARTFRAME=116 NUMFRAMES=13
  341. #exec MESH SEQUENCE MESH=Eightm SEQ=Fire6    STARTFRAME=130 NUMFRAMES=16
  342. #exec MESH SEQUENCE MESH=Eightm SEQ=Down     STARTFRAME=146 NUMFRAMES=11 
  343. #exec MESH SEQUENCE MESH=Eightm SEQ=Load5    STARTFRAME=157 NUMFRAMES=7  RATE=15 
  344. #exec MESH SEQUENCE MESH=Eightm SEQ=Rotate5  STARTFRAME=164 NUMFRAMES=7  RATE=15 
  345. #exec MESH SEQUENCE MESH=Eightm SEQ=Load6    STARTFRAME=171 NUMFRAMES=6  RATE=15 
  346.  
  347. #exec TEXTURE IMPORT NAME=Eight_t FILE=MODELS\eightballpick.PCX GROUP="Skins" LODSET=2
  348. #exec TEXTURE IMPORT NAME=Eight_t1 FILE=MODELS\eight1.PCX GROUP="Skins" LODSET=2
  349. #exec TEXTURE IMPORT NAME=Eight_t2 FILE=MODELS\eight2.PCX GROUP="Skins" LODSET=2
  350. #exec TEXTURE IMPORT NAME=Eight_t3 FILE=MODELS\eight3.PCX GROUP="Skins" LODSET=2
  351. #exec TEXTURE IMPORT NAME=Eight_t4 FILE=MODELS\eight4.PCX GROUP="Skins" LODSET=2
  352. #exec OBJ LOAD FILE=Textures\Ammocount.utx  PACKAGE=Botpack.Ammocount
  353. #exec MESHMAP SCALE MESHMAP=Eightm X=0.006 Y=0.006 Z=0.012
  354. #exec MESHMAP SETTEXTURE MESHMAP=Eightm NUM=0 TEXTURE=eight_t1
  355. #exec MESHMAP SETTEXTURE MESHMAP=Eightm NUM=1 TEXTURE=eight_t2
  356. #exec MESHMAP SETTEXTURE MESHMAP=Eightm NUM=2 TEXTURE=eight_t3
  357. #exec MESHMAP SETTEXTURE MESHMAP=Eightm NUM=3 TEXTURE=eight_t4
  358. #exec MESHMAP SETTEXTURE MESHMAP=Eightm Num=4 TEXTURE=Botpack.Ammocount.MiniAmmoled
  359.  
  360. // left handed version
  361. #exec MESH IMPORT MESH=EightmL ANIVFILE=MODELS\Eightball2_a.3D  DATAFILE=MODELS\Eightball2_d.3D UNMIRROR=1 UNMIRRORTEX=4
  362. #exec MESH ORIGIN MESH=EightmL X=0 Y=0 Z=0 YAW=-64 ROLL=0
  363. #exec MESH SEQUENCE MESH=EightmL SEQ=All      STARTFRAME=0   NUMFRAMES=169
  364. #exec MESH SEQUENCE MESH=EightmL SEQ=Select   STARTFRAME=0   NUMFRAMES=20 RATE=33 GROUP=Select
  365. #exec MESH SEQUENCE MESH=EightmL SEQ=Still    STARTFRAME=19  NUMFRAMES=1
  366. #exec MESH SEQUENCE MESH=EightmL SEQ=Idle     STARTFRAME=19  NUMFRAMES=1
  367. #exec MESH SEQUENCE MESH=EightmL SEQ=Fire1    STARTFRAME=20  NUMFRAMES=8
  368. #exec MESH SEQUENCE MESH=EightmL SEQ=Load1    STARTFRAME=28  NUMFRAMES=7  RATE=15
  369. #exec MESH SEQUENCE MESH=EightmL SEQ=Rotate1  STARTFRAME=35  NUMFRAMES=7  RATE=15
  370. #exec MESH SEQUENCE MESH=EightmL SEQ=Load2    STARTFRAME=42  NUMFRAMES=7  RATE=15
  371. #exec MESH SEQUENCE MESH=EightmL SEQ=Fire2    STARTFRAME=49  NUMFRAMES=11
  372. #exec MESH SEQUENCE MESH=EightmL SEQ=Rotate2  STARTFRAME=60  NUMFRAMES=7  RATE=15
  373. #exec MESH SEQUENCE MESH=EightmL SEQ=Load3    STARTFRAME=67  NUMFRAMES=7  RATE=15
  374. #exec MESH SEQUENCE MESH=EightmL SEQ=Fire3    STARTFRAME=74  NUMFRAMES=10
  375. #exec MESH SEQUENCE MESH=EightmL SEQ=Rotate3  STARTFRAME=84  NUMFRAMES=7  RATE=15
  376. #exec MESH SEQUENCE MESH=EightmL SEQ=Load4    STARTFRAME=91  NUMFRAMES=7  RATE=15
  377. #exec MESH SEQUENCE MESH=EightmL SEQ=Fire4    STARTFRAME=98  NUMFRAMES=11
  378. #exec MESH SEQUENCE MESH=EightmL SEQ=Rotate4  STARTFRAME=109 NUMFRAMES=7  RATE=15
  379. #exec MESH SEQUENCE MESH=EightmL SEQ=Fire5    STARTFRAME=116 NUMFRAMES=13
  380. #exec MESH SEQUENCE MESH=EightmL SEQ=Fire6    STARTFRAME=130 NUMFRAMES=16
  381. #exec MESH SEQUENCE MESH=EightmL SEQ=Down     STARTFRAME=146 NUMFRAMES=11 
  382. #exec MESH SEQUENCE MESH=EightmL SEQ=Load5    STARTFRAME=157 NUMFRAMES=7  RATE=15 
  383. #exec MESH SEQUENCE MESH=EightmL SEQ=Rotate5  STARTFRAME=164 NUMFRAMES=7  RATE=15 
  384. #exec MESH SEQUENCE MESH=EightmL SEQ=Load6    STARTFRAME=171 NUMFRAMES=6  RATE=15 
  385.  
  386. #exec MESHMAP SCALE MESHMAP=EightmL X=0.006 Y=0.006 Z=0.012
  387. #exec MESHMAP SETTEXTURE MESHMAP=EightmL NUM=0 TEXTURE=eight_t1
  388. #exec MESHMAP SETTEXTURE MESHMAP=EightmL NUM=1 TEXTURE=eight_t2
  389. #exec MESHMAP SETTEXTURE MESHMAP=EightmL NUM=2 TEXTURE=eight_t3
  390. #exec MESHMAP SETTEXTURE MESHMAP=EightmL NUM=3 TEXTURE=eight_t4
  391. #exec MESHMAP SETTEXTURE MESHMAP=EightmL Num=4 TEXTURE=Botpack.Ammocount.MiniAmmoled
  392.  
  393. #exec MESH IMPORT MESH=Eight2Pick ANIVFILE=MODELS\EightPick_a.3D DATAFILE=MODELS\EightPick_d.3D X=0 Y=0 Z=0
  394. #exec MESH ORIGIN MESH=Eight2Pick X=0 Y=170 Z=0 YAW=64
  395. #exec MESH SEQUENCE MESH=eight2pick SEQ=All    STARTFRAME=0   NUMFRAMES=1
  396. #exec MESH SEQUENCE MESH=eight2pick SEQ=Still  STARTFRAME=0   NUMFRAMES=1
  397. #exec MESHMAP SCALE MESHMAP=eight2pick X=0.12 Y=0.12 Z=0.24
  398. #exec MESHMAP SETTEXTURE MESHMAP=eight2pick NUM=2 TEXTURE=Eight_t
  399.  
  400. // 3rd person perspective version
  401. #exec MESH IMPORT MESH=EightHand ANIVFILE=MODELS\EightPick_a.3D DATAFILE=MODELS\EightPick_d.3D
  402. #exec MESH ORIGIN MESH=EightHand X=-5 Y=-125 Z=-30 YAW=-64 
  403. #exec MESH SEQUENCE MESH=EightHand SEQ=All    STARTFRAME=0   NUMFRAMES=1
  404. #exec MESH SEQUENCE MESH=EightHand SEQ=Still  STARTFRAME=0   NUMFRAMES=1
  405. #exec MESHMAP SCALE MESHMAP=EightHand X=0.07 Y=0.07 Z=0.14
  406. #exec MESHMAP SETTEXTURE MESHMAP=EightHand NUM=2 TEXTURE=Eight_t
  407.  
  408. #exec TEXTURE IMPORT NAME=Crosshair6 FILE=..\unrealshare\Textures\Hud\chair6.PCX GROUP="Icons" FLAGS=2 MIPS=OFF
  409. #exec TEXTURE IMPORT NAME=Icon8ball FILE=TEXTURES\HUD\WpnRockt.PCX GROUP="Icons" MIPS=OFF
  410. #exec TEXTURE IMPORT NAME=Use8ball FILE=TEXTURES\HUD\UseRockt.PCX GROUP="Icons" MIPS=OFF
  411.  
  412. var name LoadAnim[6], RotateAnim[6], FireAnim[6];
  413. var int RocketsLoaded, ClientRocketsLoaded;
  414. var bool bFireLoad,bTightWad, bInstantRocket, bAlwaysInstant, bClientDone, bRotated, bPendingLock;
  415. var Actor LockedTarget, NewTarget, OldTarget;
  416.  
  417. Replication
  418. {
  419.     reliable if ( Role == ROLE_Authority )
  420.         bInstantRocket;
  421. }
  422.  
  423. function setHand(float Hand)
  424. {
  425.     Super.SetHand(Hand);
  426.  
  427.     if ( Hand == 0 )
  428.         PlayerViewOffset.Y = 0;
  429.     if ( Hand == 1 )
  430.         Mesh = mesh(DynamicLoadObject("Botpack.EightML", class'Mesh'));
  431.     else
  432.         Mesh = mesh'EightM';
  433. }
  434.  
  435. function BecomeItem()
  436. {
  437.     local TournamentPlayer TP;
  438.  
  439.     Super.BecomeItem();
  440.     TP = TournamentPlayer(Instigator);
  441.     bInstantRocket = bAlwaysInstant || ( (TP != None) && TP.bInstantRocket );
  442. }
  443.  
  444. simulated event RenderTexture(ScriptedTexture Tex)
  445. {
  446.     local Color C;
  447.     local string Temp;
  448.     
  449.     if ( AmmoType != None )
  450.         Temp = String(AmmoType.AmmoAmount);
  451.  
  452.     while(Len(Temp) < 3) Temp = "0"$Temp;
  453.  
  454.     C.R = 255;
  455.     C.G = 0;
  456.     C.B = 0;
  457.  
  458.     Tex.DrawColoredText( 2, 10, Temp, Font'LEDFont2', C );    
  459. }
  460.  
  461. simulated event RenderOverlays( canvas Canvas )
  462. {
  463.     Texture'MiniAmmoled'.NotifyActor = Self;
  464.     Super.RenderOverlays(Canvas);
  465.     Texture'MiniAmmoled'.NotifyActor = None;
  466. }
  467.  
  468. simulated function PostRender( canvas Canvas )
  469. {
  470.     local float XScale;
  471.  
  472.     Super.PostRender(Canvas);
  473.     bOwnsCrossHair = bLockedOn;
  474.     if ( bOwnsCrossHair )
  475.     {
  476.         // if locked on, draw special crosshair
  477.         XScale = FMax(1.0, Canvas.ClipX/640.0);
  478.         Canvas.SetPos(0.5 * (Canvas.ClipX - Texture'Crosshair6'.USize * XScale), 0.5 * (Canvas.ClipY - Texture'Crosshair6'.VSize * XScale));
  479.         Canvas.Style = ERenderStyle.STY_Normal;
  480.         Canvas.DrawIcon(Texture'Crosshair6', 1.0);
  481.         Canvas.Style = 1;    
  482.     }
  483. }
  484.         
  485. simulated function PlayLoading(float rate, int num)
  486. {
  487.     if ( Owner == None )
  488.         return;
  489.     Owner.PlayOwnedSound(CockingSound, SLOT_None, Pawn(Owner).SoundDampening);
  490.     PlayAnim(LoadAnim[num],, 0.05);
  491. }
  492.  
  493. simulated function PlayRotating(int num)
  494. {
  495.     Owner.PlayOwnedSound(Misc3Sound, SLOT_None, 0.1*Pawn(Owner).SoundDampening);
  496.     PlayAnim(RotateAnim[num],, 0.05);
  497. }
  498.  
  499. simulated function PlayRFiring(int num)
  500. {
  501.     if ( Owner.IsA('PlayerPawn') )
  502.     {
  503.         PlayerPawn(Owner).shakeview(ShakeTime, ShakeMag*RocketsLoaded, ShakeVert); //shake player view
  504.         PlayerPawn(Owner).ClientInstantFlash( -0.4, vect(650, 450, 190));
  505.     }
  506.     if ( Affector != None )
  507.         Affector.FireEffect();
  508.     if ( bFireLoad )
  509.         PlayOwnedSound(class'ut_grenade'.Default.SpawnSound, SLOT_None, 4.0*Pawn(Owner).SoundDampening);
  510.     else
  511.         PlayOwnedSound(AltFireSound, SLOT_None, 4.0*Pawn(Owner).SoundDampening);
  512.     if ( bFireLoad && bInstantRocket )
  513.         PlayAnim(FireAnim[num], 0.54, 0.05);
  514.     else                
  515.         PlayAnim(FireAnim[num], 0.6, 0.05);
  516. }
  517.  
  518. simulated function PlayIdleAnim()
  519. {
  520.     if ( Mesh == PickupViewMesh )
  521.         return;
  522.     if (AnimSequence == LoadAnim[0] )
  523.         PlayAnim('Idle',0.1,0.0);
  524.     else
  525.         TweenAnim('Idle', 0.5);
  526. }
  527.  
  528. function float RateSelf( out int bUseAltMode )
  529. {
  530.     local float EnemyDist, Rating;
  531.     local bool bRetreating;
  532.     local vector EnemyDir;
  533.     local Pawn P;
  534.  
  535.     if ( AmmoType.AmmoAmount <=0 )
  536.         return -2;
  537.  
  538.     bUseAltMode = 0;
  539.     P = Pawn(Owner);
  540.     if ( P.Enemy == None )
  541.         return AIRating;
  542.  
  543.     if ( (P.Base != None) && (P.Base.Velocity != vect(0,0,0))
  544.         && !P.CheckFutureSight(0.1) )
  545.         return 0.1;
  546.  
  547.     EnemyDir = P.Enemy.Location - Owner.Location; 
  548.     EnemyDist = VSize(EnemyDir);
  549.     Rating = AIRating;
  550.     if ( EnemyDist < 360 )
  551.     {
  552.         if ( P.Weapon == self )
  553.         {
  554.             if ( (EnemyDist > 230) || ((P.Health < 50) && (P.Health < P.Enemy.Health - 30)) )
  555.                 return Rating;
  556.         }
  557.         return 0.05 + EnemyDist * 0.001;
  558.     }
  559.     if ( P.Enemy.IsA('StationaryPawn') )
  560.         Rating += 0.4;
  561.     if ( Owner.Location.Z > P.Enemy.Location.Z + 120 )
  562.         Rating += 0.25;
  563.     else if ( P.Enemy.Location.Z > Owner.Location.Z + 160 )
  564.         Rating -= 0.35;
  565.     else if ( P.Enemy.Location.Z > Owner.Location.Z + 80 )
  566.         Rating -= 0.05;
  567.     if ( (Owner.Physics == PHYS_Falling) || Owner.Region.Zone.bWaterZone )
  568.         bUseAltMode = 0;
  569.     else if ( EnemyDist < -1.5 * EnemyDir.Z )
  570.         bUseAltMode = int( FRand() < 0.5 );
  571.     else
  572.     {
  573.         bRetreating = ( ((EnemyDir/EnemyDist) Dot Owner.Velocity) < -0.7 );
  574.         bUseAltMode = 0;
  575.         if ( bRetreating && (EnemyDist < 800) && (FRand() < 0.4) )
  576.             bUseAltMode = 1;
  577.     }
  578.     return Rating;
  579. }
  580.  
  581. // return delta to combat style
  582. function float SuggestAttackStyle()
  583. {
  584.     local float EnemyDist;
  585.  
  586.     EnemyDist = VSize(Pawn(Owner).Enemy.Location - Owner.Location);
  587.     if ( EnemyDist < 600 )
  588.     {
  589.         if ( EnemyDist < 300 )
  590.             return -1.5;
  591.         else
  592.             return -0.7;
  593.     }
  594.     else
  595.         return -0.2;
  596. }
  597.  
  598. function Fire( float Value )
  599. {
  600.     local TournamentPlayer TP;
  601.  
  602.     bPointing=True;
  603.     if ( AmmoType == None )
  604.     {
  605.         // ammocheck
  606.         GiveAmmo(Pawn(Owner));
  607.     }
  608.     if ( AmmoType.UseAmmo(1) )
  609.     {
  610.         TP = TournamentPlayer(Instigator);
  611.         bCanClientFire = true;
  612.         bInstantRocket = bAlwaysInstant || ( (TP != None) && TP.bInstantRocket );
  613.         if ( bInstantRocket )
  614.         {
  615.             bFireLoad = True;
  616.             RocketsLoaded = 1;
  617.             GotoState('');
  618.             GotoState('FireRockets', 'Begin');
  619.         }
  620.         else if ( Instigator.IsA('Bot') )
  621.         {
  622.             if ( LockedTarget != None )
  623.             {
  624.                 bFireLoad = True;
  625.                 RocketsLoaded = 1;
  626.                 Instigator.bFire = 0;
  627.                 bPendingLock = true;
  628.                 GotoState('');
  629.                 GotoState('FireRockets', 'Begin');
  630.                 return;
  631.             }
  632.             else if ( (NewTarget != None) && !NewTarget.IsA('StationaryPawn')
  633.                 && (FRand() < 0.8)
  634.                 && (VSize(Instigator.Location - NewTarget.Location) > 400 + 400 * (1.25 - TimerCounter) + 1300 * FRand()) )
  635.             {
  636.                 Instigator.bFire = 0;
  637.                 bPendingLock = true;
  638.                 GotoState('Idle','PendingLock');
  639.                 return;
  640.             }
  641.             else if ( !Bot(Owner).bNovice 
  642.                     && (FRand() < 0.7)
  643.                     && IsInState('Idle') && (Instigator.Enemy != None)
  644.                     && ((Instigator.Enemy == Instigator.Target) || (Instigator.Target == None))
  645.                     && !Instigator.Enemy.IsA('StationaryPawn')
  646.                     && (VSize(Instigator.Location - Instigator.Enemy.Location) > 700 + 1300 * FRand())
  647.                     && (VSize(Instigator.Location - Instigator.Enemy.Location) < 2000) )
  648.             {
  649.                 NewTarget = CheckTarget();
  650.                 OldTarget = NewTarget;
  651.                 if ( NewTarget == Instigator.Enemy )
  652.                 {
  653.                     if ( TimerCounter > 0.6 )
  654.                         SetTimer(1.0, true);
  655.                     Instigator.bFire = 0;
  656.                     bPendingLock = true;
  657.                     GotoState('Idle','PendingLock');
  658.                     return;
  659.                 }
  660.             }
  661.             bPendingLock = false;
  662.             GotoState('NormalFire');
  663.         }
  664.         else
  665.             GotoState('NormalFire');
  666.     }
  667. }
  668.  
  669. simulated function bool ClientFire( float Value )
  670. {
  671.     if ( bCanClientFire && ((Role == ROLE_Authority) || (AmmoType == None) || (AmmoType.AmmoAmount > 0)) )
  672.     {
  673.         GotoState('ClientFiring');
  674.         return true;
  675.     }
  676.     return false;
  677. }
  678.  
  679. simulated function FiringRockets()
  680. {
  681.     PlayRFiring(ClientRocketsLoaded - 1);
  682.     bClientDone = true;
  683.     Disable('Tick');
  684. }
  685.  
  686. function AltFire( float Value )
  687. {
  688.     bPointing=True;
  689.     bCanClientFire = true;
  690.     if ( AmmoType == None )
  691.     {
  692.         // ammocheck
  693.         GiveAmmo(Pawn(Owner));
  694.     }
  695.     if ( AmmoType.UseAmmo(1) )
  696.         GoToState('AltFiring');
  697. }
  698.  
  699. simulated function bool ClientAltFire( float Value )
  700. {
  701.     if ( bCanClientFire && ((Role == ROLE_Authority) || (AmmoType == None) || (AmmoType.AmmoAmount > 0)) )
  702.     {
  703.         GotoState('ClientAltFiring');
  704.         return true;
  705.     }
  706.     return false;
  707. }
  708.  
  709. function Actor CheckTarget()
  710. {
  711.     local Actor ETarget;
  712.     local Vector Start, X,Y,Z;
  713.     local float bestDist, bestAim;
  714.     local Pawn PawnOwner;
  715.     local rotator AimRot;
  716.     local int diff;
  717.  
  718.     PawnOwner = Pawn(Owner);
  719.     bPointing = false;
  720.     if ( Owner.IsA('PlayerPawn') )
  721.     {
  722.         GetAxes(PawnOwner.ViewRotation,X,Y,Z);
  723.         Start = Owner.Location + CalcDrawOffset() + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; 
  724.         bestAim = 0.93;
  725.         ETarget = PawnOwner.PickTarget(bestAim, bestDist, X, Start);
  726.     }
  727.     else if ( PawnOwner.Enemy == None )
  728.         return None; 
  729.     else if ( Owner.IsA('Bot') && Bot(Owner).bNovice )
  730.         return None;
  731.     else if ( VSize(PawnOwner.Enemy.Location - PawnOwner.Location) < 2000 )
  732.     {
  733.         Start = Owner.Location + CalcDrawOffset() + FireOffset.Z * vect(0,0,1); 
  734.         AimRot = rotator(PawnOwner.Enemy.Location - Start);
  735.         diff = abs((AimRot.Yaw & 65535) - (PawnOwner.Rotation.Yaw & 65535));
  736.         if ( (diff > 7200) && (diff < 58335) )
  737.             return None;
  738.         // check if can hold lock
  739.         if ( !bPendingLock ) //not already locked
  740.         {
  741.             AimRot = rotator(PawnOwner.Enemy.Location + (3 - PawnOwner.Skill) * 0.3 * PawnOwner.Enemy.Velocity - Start);
  742.             diff = abs((AimRot.Yaw & 65535) - (PawnOwner.Rotation.Yaw & 65535));
  743.             if ( (diff > 16000) && (diff < 49535) )
  744.                 return None;
  745.         }
  746.                              
  747.         // check line of sight
  748.         ETarget = Trace(X,Y, PawnOwner.Enemy.Location, Start, false);
  749.         if ( ETarget != None )
  750.             return None;
  751.  
  752.         return PawnOwner.Enemy;
  753.     }
  754.     bPointing = (ETarget != None);
  755.     Return ETarget;
  756. }
  757.  
  758. //////////////////////////////////////////////////////
  759. state AltFiring
  760. {
  761.     function Tick( float DeltaTime )
  762.     {
  763.         if( (pawn(Owner).bAltFire==0) || (RocketsLoaded > 5) )  // If if Fire button down, load up another
  764.              GoToState('FireRockets');
  765.     }
  766.  
  767.     
  768.     function AnimEnd()
  769.     {
  770.         if ( bRotated )
  771.         {
  772.             bRotated = false;
  773.             PlayLoading(1.1, RocketsLoaded);
  774.         }
  775.         else
  776.         {
  777.             if ( RocketsLoaded == 6 )
  778.             {
  779.                 GotoState('FireRockets');
  780.                 return;
  781.             }
  782.             RocketsLoaded++;
  783.             AmmoType.UseAmmo(1);        
  784.             if ( (PlayerPawn(Owner) == None) && ((FRand() > 0.5) || (Pawn(Owner).Enemy == None)) )
  785.                 Pawn(Owner).bAltFire = 0;
  786.             bPointing = true;
  787.             Owner.MakeNoise(0.6 * Pawn(Owner).SoundDampening);        
  788.             RotateRocket();
  789.         }
  790.     }
  791.  
  792.     function RotateRocket()
  793.     {
  794.         if (AmmoType.AmmoAmount<=0)
  795.         { 
  796.             GotoState('FireRockets');
  797.             return;
  798.         }        
  799.         PlayRotating(RocketsLoaded-1);
  800.         bRotated = true;
  801.     }
  802.  
  803.     function BeginState()
  804.     {
  805.         Super.BeginState();
  806.         RocketsLoaded = 1;
  807.         bFireLoad = False;
  808.         RotateRocket();
  809.     }
  810.  
  811. Begin:
  812.     bLockedOn = False;
  813. }
  814.  
  815. ///////////////////////////////////////////////////////
  816. state NormalFire
  817. {
  818.     function bool SplashJump()
  819.     {
  820.         return true;
  821.     }
  822.  
  823.     function Tick( float DeltaTime )
  824.     {
  825.         if ( (PlayerPawn(Owner) == None) 
  826.             && ((Pawn(Owner).MoveTarget != Pawn(Owner).Target) 
  827.                 || (LockedTarget != None)
  828.                 || (Pawn(Owner).Enemy == None)
  829.                 || ( Mover(Owner.Base) != None )
  830.                 || ((Owner.Physics == PHYS_Falling) && (Owner.Velocity.Z < 5))
  831.                 || (VSize(Owner.Location - Pawn(Owner).Target.Location) < 400)
  832.                 || !Pawn(Owner).CheckFutureSight(0.15)) )
  833.             Pawn(Owner).bFire = 0;
  834.  
  835.         if( pawn(Owner).bFire==0 || RocketsLoaded > 5)  // If Fire button down, load up another
  836.              GoToState('FireRockets');
  837.     }
  838.     
  839.     function AnimEnd()
  840.     {
  841.         if ( bRotated )
  842.         {
  843.             bRotated = false;
  844.             PlayLoading(1.1, RocketsLoaded);
  845.         }
  846.         else
  847.         {
  848.             if ( RocketsLoaded == 6 )
  849.             {
  850.                 GotoState('FireRockets');
  851.                 return;
  852.             }
  853.             RocketsLoaded++;
  854.             AmmoType.UseAmmo(1);
  855.             if (pawn(Owner).bAltFire!=0) bTightWad=True;
  856.             NewTarget = CheckTarget();
  857.             if ( Pawn(NewTarget) != None )
  858.                 Pawn(NewTarget).WarnTarget(Pawn(Owner), ProjectileSpeed, vector(Pawn(Owner).ViewRotation));    
  859.             if ( LockedTarget != None )
  860.             {
  861.                 If ( NewTarget != LockedTarget ) 
  862.                 {
  863.                     LockedTarget = None;
  864.                     Owner.PlaySound(Misc2Sound, SLOT_None, Pawn(Owner).SoundDampening);
  865.                     bLockedOn=False;
  866.                 }
  867.                 else if (LockedTarget != None)
  868.                      Owner.PlaySound(Misc1Sound, SLOT_None, Pawn(Owner).SoundDampening);
  869.             }
  870.             bPointing = true;
  871.             Owner.MakeNoise(0.6 * Pawn(Owner).SoundDampening);        
  872.             RotateRocket();
  873.         }
  874.     }
  875.  
  876.     function BeginState()
  877.     {
  878.         Super.BeginState();
  879.         bFireLoad = True;
  880.         RocketsLoaded = 1;
  881.         RotateRocket();
  882.     }
  883.  
  884.     function RotateRocket()
  885.     {
  886.         if ( PlayerPawn(Owner) == None )
  887.         {
  888.             if ( FRand() > 0.33 )
  889.                 Pawn(Owner).bFire = 0;
  890.             if ( Pawn(Owner).bFire == 0 )
  891.             {
  892.                  GoToState('FireRockets');
  893.                 return;
  894.             }
  895.         }
  896.         if ( AmmoType.AmmoAmount <= 0 ) 
  897.         {
  898.             GotoState('FireRockets');
  899.             return;
  900.         }
  901.         if ( AmmoType.AmmoAmount == 1 )
  902.             Owner.PlaySound(Misc2Sound, SLOT_None, Pawn(Owner).SoundDampening); 
  903.         PlayRotating(RocketsLoaded-1);
  904.         bRotated = true;
  905.     }
  906.                 
  907. Begin:
  908.     Sleep(0.0);
  909. }
  910.  
  911. ///////////////////////////////////////////////////////
  912. state Idle
  913. {
  914.     function Timer()
  915.     {
  916.         NewTarget = CheckTarget();
  917.         if ( NewTarget == OldTarget )
  918.         {
  919.             LockedTarget = NewTarget;
  920.             If (LockedTarget != None) 
  921.             {
  922.                 bLockedOn=True;            
  923.                 Owner.MakeNoise(Pawn(Owner).SoundDampening);
  924.                 Owner.PlaySound(Misc1Sound, SLOT_None,Pawn(Owner).SoundDampening);
  925.                 if ( (Pawn(LockedTarget) != None) && (FRand() < 0.7) )
  926.                     Pawn(LockedTarget).WarnTarget(Pawn(Owner), ProjectileSpeed, vector(Pawn(Owner).ViewRotation));    
  927.                 if ( bPendingLock )
  928.                 {
  929.                     OldTarget = NewTarget;
  930.                     Pawn(Owner).bFire = 0;
  931.                     bFireLoad = True;
  932.                     RocketsLoaded = 1;
  933.                     GotoState('FireRockets', 'Begin');
  934.                     return;
  935.                 }
  936.             }
  937.         }
  938.         else if( (OldTarget != None) && (NewTarget == None) ) 
  939.         {
  940.             Owner.PlaySound(Misc2Sound, SLOT_None,Pawn(Owner).SoundDampening);
  941.             bLockedOn = False;
  942.         }
  943.         else 
  944.         {
  945.             LockedTarget = None;
  946.             bLockedOn = False;
  947.         }
  948.         OldTarget = NewTarget;
  949.         bPendingLock = false;
  950.     }
  951.  
  952. Begin:
  953.     if (Pawn(Owner).bFire!=0) Fire(0.0);
  954.     if (Pawn(Owner).bAltFire!=0) AltFire(0.0);    
  955.     bPointing=False;
  956.     if (AmmoType.AmmoAmount<=0) 
  957.         Pawn(Owner).SwitchToBestWeapon();  //Goto Weapon that has Ammo
  958.     PlayIdleAnim();
  959.     OldTarget = CheckTarget();
  960.     SetTimer(1.25,True);
  961.     LockedTarget = None;
  962.     bLockedOn = False;
  963. PendingLock:
  964.     if ( bPendingLock )
  965.         bPointing = true;
  966.     if ( TimerRate <= 0 )
  967.         SetTimer(1.0, true);
  968. }
  969.  
  970.  
  971. state ClientReload
  972. {
  973.     simulated function bool ClientFire(float Value)
  974.     {
  975.         bForceFire = bForceFire || ( bCanClientFire && (Pawn(Owner) != None) && (AmmoType.AmmoAmount > 0) );
  976.         return bForceFire;
  977.     }
  978.  
  979.     simulated function bool ClientAltFire(float Value)
  980.     {
  981.         bForceAltFire = bForceAltFire || ( bCanClientFire && (Pawn(Owner) != None) && (AmmoType.AmmoAmount > 0) );
  982.         return bForceAltFire;
  983.     }
  984.  
  985.     simulated function AnimEnd()
  986.     {
  987.         if ( bCanClientFire && (PlayerPawn(Owner) != None) && (AmmoType.AmmoAmount > 0) )
  988.         {
  989.             if ( bForceFire || (Pawn(Owner).bFire != 0) )
  990.             {
  991.                 Global.ClientFire(0);
  992.                 return;
  993.             }
  994.             else if ( bForceAltFire || (Pawn(Owner).bAltFire != 0) )
  995.             {
  996.                 Global.ClientAltFire(0);
  997.                 return;
  998.             }
  999.         }            
  1000.         GotoState('');
  1001.         Global.AnimEnd();
  1002.     }
  1003.  
  1004.     simulated function EndState()
  1005.     {
  1006.         bForceFire = false;
  1007.         bForceAltFire = false;
  1008.     }
  1009.  
  1010.     simulated function BeginState()
  1011.     {
  1012.         bForceFire = false;
  1013.         bForceAltFire = false;
  1014.     }
  1015. }
  1016.  
  1017. state ClientFiring
  1018. {
  1019.     simulated function Tick(float DeltaTime)
  1020.     {
  1021.         if ( (Pawn(Owner).bFire == 0) || (Ammotype.AmmoAmount <= 0) )
  1022.             FiringRockets();
  1023.     }
  1024.     
  1025.     simulated function AnimEnd()
  1026.     {
  1027.         if ( !bCanClientFire || (Pawn(Owner) == None) )
  1028.             GotoState('');
  1029.         else if ( bClientDone )
  1030.         {
  1031.             PlayLoading(1.5,0);
  1032.             GotoState('ClientReload');
  1033.         }
  1034.         else if ( bRotated )
  1035.         {
  1036.             PlayLoading(1.1, ClientRocketsLoaded);
  1037.             bRotated = false;
  1038.             ClientRocketsLoaded++;
  1039.         }
  1040.         else
  1041.         {
  1042.             if ( bInstantRocket || (ClientRocketsLoaded == 6) )
  1043.             {
  1044.                 FiringRockets();
  1045.                 return;
  1046.             }
  1047.             Enable('Tick');
  1048.             PlayRotating(ClientRocketsLoaded - 1);
  1049.             bRotated = true;
  1050.         }
  1051.     }
  1052.  
  1053.     simulated function BeginState()
  1054.     {
  1055.         bFireLoad = true;
  1056.         if ( bInstantRocket )
  1057.         {
  1058.             ClientRocketsLoaded = 1;
  1059.             FiringRockets();
  1060.         }
  1061.         else
  1062.         {
  1063.             ClientRocketsLoaded = 1;
  1064.             PlayRotating(ClientRocketsLoaded - 1);
  1065.             bRotated = true;
  1066.         }
  1067.     }
  1068.  
  1069.     simulated function EndState()
  1070.     {
  1071.         ClientRocketsLoaded = 0;
  1072.         bClientDone = false;
  1073.         bRotated = false;
  1074.     }
  1075. }
  1076.  
  1077. state ClientAltFiring
  1078. {
  1079.     simulated function Tick(float DeltaTime)
  1080.     {
  1081.         if ( (Pawn(Owner).bAltFire == 0) || (Ammotype.AmmoAmount <= 0) )
  1082.             FiringRockets();
  1083.     }
  1084.     
  1085.     simulated function AnimEnd()
  1086.     {
  1087.         if ( !bCanClientFire || (Pawn(Owner) == None) )
  1088.             GotoState('');
  1089.         else if ( bClientDone )
  1090.         {
  1091.             PlayLoading(1.5,0);
  1092.             GotoState('ClientReload');
  1093.         }
  1094.         else if ( bRotated )
  1095.         {
  1096.             PlayLoading(1.1, ClientRocketsLoaded);
  1097.             bRotated = false;
  1098.             ClientRocketsLoaded++;
  1099.         }
  1100.         else
  1101.         {
  1102.             if ( ClientRocketsLoaded == 6 )
  1103.             {
  1104.                 FiringRockets();
  1105.                 return;
  1106.             }
  1107.             Enable('Tick');
  1108.             PlayRotating(ClientRocketsLoaded - 1);
  1109.             bRotated = true;
  1110.         }
  1111.     }
  1112.  
  1113.     simulated function BeginState()
  1114.     {
  1115.         bFireLoad = false;
  1116.         ClientRocketsLoaded = 1;
  1117.         PlayRotating(ClientRocketsLoaded - 1);
  1118.         bRotated = true;
  1119.     }
  1120.  
  1121.     simulated function EndState()
  1122.     {
  1123.         ClientRocketsLoaded = 0;
  1124.         bClientDone = false;
  1125.         bRotated = false;
  1126.     }
  1127. }
  1128.  
  1129. ///////////////////////////////////////////////////////
  1130. state FireRockets
  1131. {
  1132.     function Fire(float F) {}
  1133.     function AltFire(float F) {}
  1134.  
  1135.     function ForceFire()
  1136.     {
  1137.         bForceFire = true;
  1138.     }
  1139.  
  1140.     function ForceAltFire()
  1141.     {
  1142.         bForceAltFire = true;
  1143.     }
  1144.  
  1145.     function bool SplashJump()
  1146.     {
  1147.         return false;
  1148.     }
  1149.  
  1150.     function BeginState()
  1151.     {
  1152.         local vector FireLocation, StartLoc, X,Y,Z;
  1153.         local rotator FireRot, RandRot;
  1154.         local ut_grenade r;
  1155.         local UT_SeekingRocket s;
  1156.         local PipeBomb g;
  1157.         local float Angle, RocketRad;
  1158.         local pawn BestTarget, PawnOwner;
  1159.         local PlayerPawn PlayerOwner;
  1160.         local int DupRockets;
  1161.         local bool bMultiRockets;
  1162.  
  1163.         PawnOwner = Pawn(Owner);
  1164.         if ( PawnOwner == None )
  1165.             return;
  1166.         PawnOwner.PlayRecoil(FiringSpeed);
  1167.         PlayerOwner = PlayerPawn(Owner);
  1168.         Angle = 0;
  1169.         DupRockets = RocketsLoaded - 1;
  1170.         if (DupRockets < 0) DupRockets = 0;
  1171.         if ( PlayerOwner == None )
  1172.             bTightWad = ( FRand() * 4 < PawnOwner.skill );
  1173.  
  1174.         GetAxes(PawnOwner.ViewRotation,X,Y,Z);
  1175.         StartLoc = Owner.Location + CalcDrawOffset() + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; 
  1176.  
  1177.         if ( bFireLoad )         
  1178.             AdjustedAim = PawnOwner.AdjustAim(ProjectileSpeed, StartLoc, AimError, True, bWarnTarget);
  1179.         else 
  1180.             AdjustedAim = PawnOwner.AdjustToss(AltProjectileSpeed, StartLoc, AimError, True, bAltWarnTarget);    
  1181.             
  1182.         if ( PlayerOwner != None )
  1183.             AdjustedAim = PawnOwner.ViewRotation;
  1184.         
  1185.         PlayRFiring(RocketsLoaded-1);        
  1186.         Owner.MakeNoise(PawnOwner.SoundDampening);
  1187.         if ( !bFireLoad )
  1188.         {
  1189.             LockedTarget = None;
  1190.             bLockedOn = false;
  1191.         }
  1192.         else if ( LockedTarget != None )
  1193.         {
  1194.             BestTarget = Pawn(CheckTarget());
  1195.             if ( (LockedTarget!=None) && (LockedTarget != BestTarget) ) 
  1196.             {
  1197.                 LockedTarget = None;
  1198.                 bLockedOn=False;
  1199.             }
  1200.         }
  1201.         else 
  1202.             BestTarget = None;
  1203.         bPendingLock = false;
  1204.         bPointing = true;
  1205.         FireRot = AdjustedAim;
  1206.         RocketRad = 4;
  1207.         if (bTightWad || !bFireLoad) RocketRad=7;
  1208.         bMultiRockets = ( RocketsLoaded > 1 );
  1209.         While ( RocketsLoaded > 0 )
  1210.         {
  1211.             if ( bMultiRockets )
  1212.                 Firelocation = StartLoc - (Sin(Angle)*RocketRad - 7.5)*Y + (Cos(Angle)*RocketRad - 7)*Z - X * 4 * FRand();
  1213.             else
  1214.                 FireLocation = StartLoc;
  1215.             if (bFireLoad)
  1216.             {
  1217.                 if ( Angle > 0 )
  1218.                 {
  1219.                     if ( Angle < 3 && !bTightWad)
  1220.                         FireRot.Yaw = AdjustedAim.Yaw - Angle * 600;
  1221.                     else if ( Angle > 3.5 && !bTightWad)
  1222.                         FireRot.Yaw = AdjustedAim.Yaw + (Angle - 3)  * 600;
  1223.                     else
  1224.                         FireRot.Yaw = AdjustedAim.Yaw;
  1225.                 }
  1226.                 if ( LockedTarget != None )
  1227.                 {
  1228.                     Owner.MakeNoise(0.6 * Pawn(Owner).SoundDampening);
  1229.                     r = Spawn( class'ut_grenade',, '', FireLocation,FireRot);
  1230.                     r.NumExtraGrenades = DupRockets;
  1231.                     if ( DupRockets > 0 )
  1232.                     {
  1233.                         RandRot.Pitch = FRand() * 1500 - 750;
  1234.                         RandRot.Yaw = FRand() * 1500 - 750;
  1235.                         RandRot.Roll = FRand() * 1500 - 750;
  1236.                         r.Velocity = r.Velocity >> RandRot;
  1237.                     }    
  1238.                     
  1239.                 }
  1240.                 else 
  1241.                 {    
  1242.                     Owner.MakeNoise(0.6 * Pawn(Owner).SoundDampening);
  1243.                     r = Spawn( class'ut_grenade',, '', FireLocation,FireRot);
  1244.                     r.NumExtraGrenades = DupRockets;
  1245.                     if ( DupRockets > 0 )
  1246.                     {
  1247.                         RandRot.Pitch = FRand() * 1500 - 750;
  1248.                         RandRot.Yaw = FRand() * 1500 - 750;
  1249.                         RandRot.Roll = FRand() * 1500 - 750;
  1250.                         r.Velocity = r.Velocity >> RandRot;
  1251.                     }
  1252.                 }
  1253.             }
  1254.             else 
  1255.             {
  1256.                 g = Spawn( class 'PipeBomb',, '', FireLocation,AdjustedAim);
  1257.                 g.NumExtraGrenades = DupRockets;
  1258.                 if ( DupRockets > 0 )
  1259.                 {
  1260.                     RandRot.Pitch = FRand() * 1500 - 750;
  1261.                     RandRot.Yaw = FRand() * 1500 - 750;
  1262.                     RandRot.Roll = FRand() * 1500 - 750;
  1263.                     g.Velocity = g.Velocity >> RandRot;
  1264.                 }
  1265.             }
  1266.  
  1267.             Angle += 1.0484; //2*3.1415/6;
  1268.             RocketsLoaded--;
  1269.         }
  1270.         bTightWad=False;
  1271.         bRotated = false;
  1272.     }
  1273.  
  1274.     function AnimEnd()
  1275.     {
  1276.         if ( !bRotated && (AmmoType.AmmoAmount > 0) ) 
  1277.         {    
  1278.             PlayLoading(1.5,0);
  1279.             RocketsLoaded = 1;
  1280.             bRotated = true;
  1281.             return;
  1282.         }
  1283.         LockedTarget = None;
  1284.         Finish();
  1285.     }
  1286. Begin:    
  1287. }
  1288.  
  1289. ïA|Ef╓ Ü:╜:$Ç          2}BÆiï÷¬Ä╤╕ÖBä9δ }ä9δ }ä9δ }â=òéä9δ }ä9δ }ä9δ }â=òéä9δ }â=òéä9δ }ò726Äò726Äò726Äâ=òéä9δ }ò726Äò726Äò726Ä    √a)╬    √a)╬    √a)╬ä9δ }Ä╤╕ÖBä9δ }Ä╤╕ÖBÄ╤╕ÖBä9δ }ä9δ }Ä╤╕ÖBÄ╤╕ÖBâ=òéä9δ }â=òéä9δ }ä9δ }ä9δ }ä9δ }â=òéä9δ }ä9δ }ä9δ }Ä╤╕ÖBä9δ }ä9δ }ä9δ }Ä╤╕ÖBÄ╤╕ÖBâ=òéä9δ }Ä╤╕ÖBä9δ }ä9δ }ä9δ }â=òéä9δ }â=òéä9δ }â=òéä9δ }ä9δ }ä9δ }ä9δ }â=òéâ=òéâ=òéâ=òéä9δ }â=òéä9δ }ä9δ }ä9δ }Ä╤╕ÖBÄ╤╕ÖBä9δ }ä9δ }â=òéä9δ }ä9δ }â=òéä9δ }â=òéä9δ }ä9δ }â=òé╢IÇ+\ä9δ }ä9δ }ä9δ }â=òéä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }Ä╤╕ÖBÄ╤╕ÖBÄ╤╕ÖBÄ╤╕ÖB¬╜╪╕ä9δ }ä9δ }â=òéä9δ }â=òéä9δ }╢IÇ+\ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }â=òéÄ╤╕ÖBä9δ }ä9δ }ä9δ }â=òéä9δ }ä9δ }ä9δ }â=òéä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }ä9δ }â=òéä9δ }ä9δ }ä9δ }ä9δ }â=òéä9δ }ä9δ }â=òéâ=òéâ=òé╞╣    â=òéâ=òéú²»Θú²»Θ÷Xu6ΦÖò726Ää9δ }ä9δ }â=òéä9δ }â=òéä9δ }¢xÅ¢xÅ¢xÅαδèZ!¢xÅαδèZ!¢xÅ¢xÅ¢xÅ│╙∩ⁿ│╙∩ⁿÄ╤╕ÖB│╙∩ⁿ¬╜╪╕ëQûJû\ûSûHûI L ûM å* ûP ûU å*må(å)ûeå(å)a]! Classification: Heavy BallisticXVA" u╙Y╙V╙U╙b$Ç?f:1 Aá└═╠ ┴FòE    C$»C@$═╠L>D$≡@y$@?z$Ç>w$Ç>X╓a╘[Φ`µ_τO╪Y]%o was blown up by %k's %w.v*?     I    8]You got the Grenade Launcher.K]Grenade Launcher~:1ÜÖ@Ç┐═╠ └\∩}$@|$ÜÖy?+±^█[φl┼{φ/±oS:$ AJ//=============================================================================
  1290. //Grenade Launcher Mutator v1.00
  1291. //by avengingangel
  1292. //
  1293. //Makes Rocket Launcher fire grenades and pipebombs, no rockets. Bind 
  1294. //"mutate detbomb" to key or type in console to detonate pipebombs.
  1295. //
  1296. //No rip-off of TF or TFC's demoman intended.
  1297. //=============================================================================
  1298. class GLMutator expands Mutator;
  1299.  
  1300. var bool bTimedExplode, bAutoDetonate, bDieDetonate, bRequireWep;
  1301. var float ExplodeTime;
  1302.  
  1303. function bool CheckReplacement (Actor Other, out byte bSuperRelevant)
  1304. {
  1305.     if (Other.IsA('UT_EightBall'))
  1306.     {
  1307.         ReplaceWith(Other, "GrenadeLauncher.GL_Eightball");    
  1308.         return false;
  1309.     }
  1310.     
  1311.     if (Other.IsA('RocketPack'))
  1312.     {
  1313.         ReplaceWith(Other, "GrenadeLauncher.GrenadePack");    
  1314.         return false;
  1315.     }
  1316.     
  1317.     return true;;
  1318. }
  1319.  
  1320. function Mutate (string MutateString, PlayerPawn Sender)
  1321. {
  1322.     local actor A;
  1323.     
  1324.     if (MutateString == "detbomb")
  1325.     {
  1326.         foreach Allactors( class 'Actor', A )
  1327.         {
  1328.             if( A.IsA('PipeBomb'))
  1329.             {
  1330.                 if( PipeBomb(A).BombOwner == Sender)
  1331.                     PipeBomb(A).Explosion(A.location);
  1332.             }
  1333.         }
  1334.     }
  1335.     
  1336.     
  1337.     if ( NextMutator != None )
  1338.         NextMutator.Mutate(MutateString, Sender);
  1339. }
  1340.  
  1341. function ScoreKill (Pawn Killer, Pawn Other)
  1342. {
  1343.     local actor A;
  1344.     
  1345.     if (bDieDetonate)
  1346.     {
  1347.         foreach Allactors( class 'Actor', A )
  1348.         {
  1349.             if (A.IsA('PipeBomb'))
  1350.             {
  1351.                 if( PipeBomb(A).BombOwner == Other)
  1352.                     PipeBomb(A).Explosion(A.Location);
  1353.                         
  1354.             }
  1355.         }
  1356.     }
  1357.         
  1358.     if ( NextMutator != None )
  1359.         NextMutator.ScoreKill(Killer, Other);
  1360. }
  1361.  
  1362. ╔GP=à!É wô* SôƒAû} , p0  6┬&=, 6└&$6⌠&$Pa┌@ A  ╥&     RÇK@┬H9Q{5F┬9.¬ÿ-ä-Jéw9*9-╚ π?=Rm;jπ='┤=?%6╓Θ]┤=?&╚.Ω╚Botpack.EightML Ωh╚ ∩ ╞%" ╞.É É≡A ACÇ?Timed Eplode%─$-╡ -5.É É≡A░AC ADetonate on death%─$-╡ -2.É É≡ABCáAAuto-detonate%─$-╡ -3.Ü Ü≡A8BC≡ATime to explode%nTime till pipe bomb explodes.%s'p't,─$╘╓@π BKU / TKqc.╤┴ ╤»┘?,0»▄?,@BÇA ╫IdW>
  1363. ╫[
  1364. ╥$d
  1365. : -5-╡
  1366. a -3-╡
  1367. ê -2-╡
  1368. ╠LLA /L ≤╧
  1369.   ╒
  1370.    io╗▌R          NjôSOI-»ä-»/éé-⌐w.äç*ùôƒ%-» ∞R<δ╒█┴ S A A A A xxw    bw    zxw    qH²   yx#w■   }w■   w√   ~B≈   1w■   Hw    KE²   mw°   xw■   Nw■   RH·   CHⁿ   rw√   XB≈   Aw■   EH²   hw■   ww°   rw    Yw°   zNⁿ   fE²   ko≥   PoΩ   GN⌠   rw    sw    &qⁿ   txCR·   DR·   Fw■   oR⌡   ]w√   pE·   U≈   E·   fR⌡   SR⌡   Jw■   @w■   {x█   `w    eEⁿ   SR≡   }w√   5qⁿ   uw°   yw    [w°   v²   |w    Mq²   vw┴   txkB≈   ?w■   DH²   iH▐   nq╚   ²   w    ~w■   FH²   /H²   lx√   ^oⁿ   k@⌡   2oΩ   pQ¼   XH·   _@⌡   'w°   t╟   PE²   ux█   HoΩ   cN⌠   sw°   uN·   ZNΣ   Dw°   wHΣ   FNΣ   CNⁿ   ]w    gq²   Zw    Qw    oN⌠   P·   R·   <qσ   nN·   yHù   fN·   \B²   lw    /w■   qNσ   vQü   dR║   _N√   aδ   ZN√   bN²   dN√   nR·   Ioδ   mδ   H·   `@⌡   $@⌡   0H═   a·   -e╢   _·   >⌡       x√   H╞   %Σ   }⌡   Qw√   TH⌡   \w°   qΣ   %w°   sR╓   YR╩   ZNΣ   Eoó   JN·   @NΣ   @oó   LN·   CN·   X─   Tw°   {N²   eHµ   BHy   yN{   G⌐   WN·   Dσ   jEⁿ   pR·   uN·   bΣ   |H·   Ox█   V·   F@·   Hⁿ   pNµ   AH·   aH╟   +N╬   [N╬   \N╬   ]E╟   ~F²   rH┬   u┬   RE²   oqƒ   dHⁿ   qN─   sH²   K≈   ≈   Qq└   JR·   Yw√   UH─   VNσ   WN─   g⌡    ⌡   ⌡   "σ   i⌡   3⌡   q└   O┤       q└   z░   ²   4Na   W░       ┤   ≈   y²   =w    Bw√   W⌡   g⌡   hH·   Xδ   @ê       ç       x╢   `▐   7N╬   Oδ   _N╬   Y▐   dN╬   Z▐   6·   ]N√   cδ   4óMOg_¿┬^ vbì┬bBcÆ┬h Oc¿┬e [cì┬qgcìT@tcìÖABdò}Odìî@LgÆ┬` Ygù½iegì½@rgÆ┬i gæ½U Kh¿½hWhìñYdhì½zqhæÖR hæÖzKiìT~XiìTeiìT}riì┬TiÆ┬a LjùîvXjù½gejÆ┬Yrj¿îl AkìíOMkìîdZk┴─P gkù½fskÆ┬g @lù½eLlìÑOYl¿ÖMflù─Qslì    |Amì¥GOmùîk]mì½OjmùîPwmùÖSDnæ½_ Qnù½s]næS jnù½Pvnæñ[ CoÆxOoÆw \oùîshoÆD voù½rBpæûR Opì½{[pì╟jhpù░PupìRjCqì½tPqæ╚E ]qìíiq╟┬vqìÑGCrƽm Pr¿£H \r┴íw hrÆÖc trÆ░D@sæ░S MsùîrYs╟┬ gsÆ╕w ssÆ┬f s┴TBKtæTC Xtæîj dtè ┬Sptè√┬HCvì─^KwìºYXwè·┬ v    ew║GZ[ü╫Czuâèⁿ┬"Soï├BtBì¿₧H vÅ¿úH BÉæîVNÉ╟┬ [Éδ╩KhÉù░ruÉù░sCæù╕~Qæì╕G_æÆ    kmæÆ    jzæ¿    m GÆìTISÆì╩QbÆìÑnpÆè¼│+~Æè─i4NiôÆ╠| wù░ß┬FCÿæ╠LI¢æmLV¢Æm| c¢èU╦"Mo¢è≥╦'|£è¼╦&c¥░╨┬',I₧è┼pAu₧è■╦    Ovƒèô]Eóè┼ôKbñætR m¿░╠┬2,y¿è╨ô    Le⌐æïR q¡è┴v    I}¡è¼v2F░è╟v+x░░┬8c▒èR| [▓æ}I x▓èO|D│æI b│è╠|g#n│è¼ô+Q┤è√|- |┤æqR \╡è╞p    Qh╡è├p+y╖è√ô-d╕Æç| C╣è┼│=O╣è¼pBL║è┼vAN╗è┬ yO╝ÆU| H┼ì½LT┼æULb┼è═|h#o┼è┬
  1371. -R╞ÆN| ╞░°┬$AK╟æRL L╚æû| X╚èα┬Fpd╚è■|    QT╩æÖ| e╦è┌┬]|    q╦è■┬3Rm╒Æy ╓è┬!qK╫è╫dF|┌è┬LB▌δ¥oN▐Æ¥| \▐è┘6Eh▐æúmmαè┬Nzαè²┬>BHΓè╙7|JσÆâ| FτèΣ┬<=Rτ▒VM4U OΦì    {d≤▒TM4x3q≤è¼|Xiºè│=A╣æ    h~╣æ    lK║æëR X║è╧    @}d║▒SM4ma╛è╤│    kN┼░∙┬0>y╟ù░iw╚▒╢M4vE╔╛H}{╬è▄    46x╤è╒    _Dn╥ìî|r╙æOL ╙▒    M4jK╘è≡    Z%uεù╝~Z∩è÷    $g∩ù╛~K≡è└S%^X≡▒┬M4a¬v±ïEe"W£▒M4U|╛è╔┬=~Q╪æNLO┌┴TA\┌è┬┬QJi┌èπ┬Rjs█è╞T%K    ]▌è╫TWlhµ░┬+TΘèN╦LΘè∞╢RMKδGrenade Launcher mutator v1.00 by avengingangel.
  1372.  
  1373. Installation: Run the Umod file.
  1374.  
  1375.  
  1376. Using: Double-click Grenade Launcher in the Mutators dialog to make it go from the Not Used to the Used column. All Rocket Launchers will be replaced with Grenade Launchers and all Rocket Packs will be replaced with Grenade Packs.
  1377.     The Grenade Launcher's primary fire is the same as the Rocket Launcher's secondary fire. The Grenade Launcher's secondary fire launches a pipebomb.
  1378.     To detonate your pipebombs you can either type "mutate detbomb" into the console (minus quotation marks),or bind the command to a key, like the middle mouse button. 
  1379.     To do this 
  1380.         1- Open up user.ini (system folder) in a text editor. 
  1381.         2- Find a line like this- Aliases[25]=(Command="",Alias=None)
  1382.         3- And change it to this- Aliases[25]=(Command="Mutate detbomb",Alias=Detbomb)
  1383.         4- Find a line like this- MiddleMouse=
  1384.         5- And change it to this- MiddleMouse=Detbomb
  1385.     Middlemouse can be any key you want, ie you could have "C=Detbomb" and it would be bound to the c key
  1386.     Now when you press the key you specified, your pipebombs should blow up.
  1387.         
  1388. Configuration: Select Grenade Launcher Configuration from the Mod menu. Options are:-
  1389.         -Timed Explode (Pipebombs explode after time specified in Time To Explode text box)
  1390.         -Detonate on death (Your pipebombs explode when you die)
  1391.         -Auto-detonate (Pipebombs detonate when they touch somebody other than you)
  1392.     
  1393.  
  1394. Notes: Auto-detonate does work, just not very well. When the pipebombs are lying on the ground they must be stepped directly on, which is easy not to do. Not tested over network. No reason it shouldn't work though.
  1395.  
  1396. Known Issues: Primary fire doesn't play the grenade launching fire. Death message is that of the Rocket Launcher
  1397.  
  1398. Contact: Please contact me at pricey_@hotmail.com to report any comments, bugs or praise :)System\Manifest.inieSystem\Manifest.inteSystem\GrenadeLauncher.intxSystem\GrenadeLauncher.uæd∩Help\GrenadeLauncherReadme.txt⌡⌠Tú┼πƒIⁿ²ùK≡